package com.chenziwen.scala.chapter06

object Scala_Trait7 {
  def main(args: Array[String]): Unit = {
    // 特质构造顺序(混入方式，会让当前类的构造器执行提前)
    // 1.调用当前类的超类构造器
    // 2.第一个特质的父特质构造器
    // 3.第一个特质构造器
    // 4.第二个特质构造器的父特质构造器，如果已经执行过，就不再执行
    // 5.第二个特质构造器
    // 6.当前类的构造器


    // 此种构造方法为:混入方式，会让当前类的构造器执行提前
    val f = new F() with C with D
    // 输出结果：EFABCD
    println(f)

    val g = new G
    // 输出结果：EABCDG
    println(g)
  }
}

trait A {
  print("A...")
}

trait B extends A {
  print("B...")
}

trait C extends B {
  print("C...")
}

trait D extends B {
  print("D...")
}

class E {
  print("E...")
}

class F extends E {
  print("F...")
}

class G extends E with C with D {
  print("G...")
}
